简介

about_Java 的 NIO 是于 1.4 版本引入的 IO 库,被称为 Java New IO 类库,简称 Java NIO。而在 Java NIO 引入之前的 Java IO 类库是阻塞 IO 也被称为 OIO(Older IO)。

Java NIO 的三个核心组件

是不是很眼熟呢?是的 Java NIO 属于 Input-Output 多路复用 模型。由 NIO 组件提供了统一的 API,使得程序员能在应用层控制和实现多路复用 IO

NIO 可以随意地读取 Buffer 中任意的数据并且组装成一个完整的数据,而 OIO 则只能顺序读取一个流中的数据。

NIO 的 Channel

一个 Channel (通道) 便对应着一个网络连接或者说一个文件描述符,和 OIO 中一个网络连接需要关联两个流 (InputStream,OutputStrem) 通过这两个流进行不断的输入和输出不同,Channel 既可以读也可以写,相当于两个流的结合。

NIO 的 Buffer

Buffer 是应用与 Channel 的沟通桥梁。NIO 使用 Buffer 缓冲区进行数据交互,- hannel 的读取就是将 Channel 的数据读到 Buffer 中,而 Channel 的写入则是将数据从 Buffer 中读到 Channel 中。
Netty、Redis、Zookeeper高并发实战#^f99d9a

NIO 的 Buffer 缓冲区本质上是一个内存块,它既可以写入数据也可以读取数据。

NIO 的 Selector

基于操作系统的 select 等实现, 它是一个 IO 时间的查询器。通过 Selector 可以在应用层面完成对多个文件描述符进行监视。而且一个 Selector 只需要一个 线程 监视,一个 Selector 可以通过管理多个 Channel 来管理多个文件描述符的状态,这样系统就不需要为每一个网络连接(文件描述符)创建 线程,极大的减少了系统的开销

Netty、Redis、Zookeeper高并发实战#3.5 详解NIO Selector选择器